﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MakeIT.Deo.Negocios;
using System.Data.Entity;
using System.IO;

namespace MakeIT.Deo.Apresentacao
{
    public partial class CadastroProduto : System.Web.UI.Page
    {
        usuario usuarioVO = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            usuarioVO = (usuario)this.Session["userActive"];

            if (!IsPostBack)
            {
                //this.ddlSubFamilia.DataSource = new SubFamiliaBO().RecuperaSubFamilia();
                //this.ddlSubFamilia.DataBind();

                this.GridViewCategoria.DataSource = new CategoriaBO().RecuperaCategoria();
                this.GridViewCategoria.DataBind();

                this.GridViewSubFamilia.DataSource = new SubFamiliaBO().RecuperaSubFamilia();
                this.GridViewSubFamilia.DataBind();

                Util.HabilitarCampos(false, this.panelCad);
                Util.HabilitarCampos(false, this.TabPanelFileUpload);
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnSalvar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {

            //Declara objetos
            produto produtoVO = null;
            ProdutoBO produtoBO = null;
            bool novoRegistro = false;

            try
            {

                //Cria objeto
                produtoBO = new ProdutoBO();

                //Verifica se o ID é nulo, se sim = cadastro novo
                if (string.IsNullOrEmpty(this.txtCadId.Text))
                {
                    produtoVO = new produto();
                    produtoVO.Cadastro = DateTime.Now;
                    produtoVO.CadastradoPor = usuarioVO.User;

                    novoRegistro = true;
                }
                //Recupera dados para serem alterados
                else
                {
                    //Recupera dados
                    produtoVO = produtoBO.RecuperaProduto(Int32.Parse(this.txtCadId.Text));

                }


                //produtoVO.IdCategoria = this.txtCadSubFamilia.Text;
                //produtoVO.IdSubFamilia = Int32.Parse(this.ddlSubFamilia.SelectedValue);
                produtoVO.Produto = this.txtCadProduto.Text;
                produtoVO.Referencia = this.txtCadRef.Text;
                produtoVO.Cor = this.txtCadCor.Text;
                produtoVO.Medida = this.txtCadMedida.Text;
                produtoVO.Embalagem = this.txtCadEmbalagem.Text;
                produtoVO.Caixa = this.txtCadCaixa.Text;
                produtoVO.Unidade = this.txtCadUnidade.Text;
                produtoVO.IPI = this.txtCadIPI.Text;

                produtoVO.Edicao = DateTime.Now;
                produtoVO.EditadoPor = usuarioVO.User;

                //Chama metodo para salvar ou criar novo registro
                produtoBO.SalvarProduto(produtoVO, novoRegistro);

                List<produtoxcategoria> listProdutoXCategoria = new List<produtoxcategoria>();
                foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                {
                    if (((CheckBox)gvr.Cells[0].Controls[1]).Checked)
                    {
                        produtoxcategoria prdXCat = new produtoxcategoria();
                        prdXCat.IdProduto = produtoVO.IdProduto;
                        prdXCat.IdCategoria = Int32.Parse(gvr.Cells[1].Text);
                        listProdutoXCategoria.Add(prdXCat);
                    }
                }
                produtoBO.DeletaProdutoxCategoria(produtoBO.RecuperaProdutoXCategoria(produtoVO.IdProduto, null));
                produtoBO.AddProdutoxCategoria(listProdutoXCategoria);

                List<produtoxsubfamilia> listProdutoXSubFamilia = new List<produtoxsubfamilia>();
                foreach (GridViewRow gvr in this.GridViewSubFamilia.Rows)
                {
                    if (((CheckBox)gvr.Cells[0].Controls[1]).Checked)
                    {
                        produtoxsubfamilia prdXSf = new produtoxsubfamilia
                        {
                            IdProduto = produtoVO.IdProduto,
                            IdSubFamilia = Int32.Parse(gvr.Cells[1].Text)
                        };
                        listProdutoXSubFamilia.Add(prdXSf);
                    }
                }
                produtoBO.DeletaProdutoXSubFamilia(produtoBO.RecuperaProdutoXSubFamilia(produtoVO.IdProduto, null));
                produtoBO.AddProdutoXSubFamilia(listProdutoXSubFamilia);

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro salvo com sucesso!");

                //Popula grid atualizado
                this.btnPesquisa_Click(null, null);

                //Limpa formulario, apos salvar os dados
                Util.LimparCampos(this.panelCad);
                this.ltCadastradoPor.Text = "";
                this.ltEditadoPor.Text = "";
                this.ltDataCadastro.Text = "";
                this.ltDataEdicao.Text = "";

                this.ImagePQ.ImageUrl = "";
                this.ImageGD.ImageUrl = "";

                foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                {
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
                }
                foreach (GridViewRow gvr in this.GridViewSubFamilia.Rows)
                {
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
                }

                // Trava bot&atilde;o de edi&ccedil;&atilde;o
                this.btnEditar.Enabled = false;

                // Trava bot&atilde;o de exclusao
                this.btnExcluir.Enabled = false;

                // Desabilita o bot&atilde;o salvar
                this.btnSalvar.Enabled = false;

                // Habilida o botao novo
                this.btnNovo.Enabled = true;

                // trava upload de imagem
                this.AsyncFileUploadPQ.Enabled = false;
                this.AsyncFileUploadGD.Enabled = false;
                this.btnVisualizarImagem.Enabled = false;
                this.btnRemoverImagemPequena.Enabled = false;
                this.btnRemoverImagemGrande.Enabled = false;

                Util.HabilitarCampos(false, this.panelCad);
                Util.HabilitarCampos(false, this.TabPanelFileUpload);
                this.GridViewCategoria.Enabled = false;
                this.GridViewSubFamilia.Enabled = false;

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnPesquisa
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnPesquisa_Click(object sender, EventArgs e)
        {

            //Declara objetos
            int? idProduto = null;
            string produto = null;
            string referencia = null;

            try
            {
                if (!string.IsNullOrEmpty(this.txtId.Text))
                {
                    idProduto = Int32.Parse(this.txtId.Text);
                }

                if (!string.IsNullOrEmpty(this.txtProduto.Text))
                {
                    produto = this.txtProduto.Text;
                }

                if (!String.IsNullOrEmpty(this.txtReferencia.Text))
                    referencia = this.txtReferencia.Text;

                //
                List<produto> listProduto = new ProdutoBO().RecuperaProduto(idProduto, produto, referencia, null, false) ?? new List<produto>();
                this.grvResultado.DataSource = listProduto.Distinct().ToList();

                //Vincula os dados
                this.grvResultado.DataBind();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnCancelar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            this.tabProduto.ActiveTabIndex = 0;

            // Desabilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(false, this.panelCad);
            Util.HabilitarCampos(false, this.TabPanelFileUpload);
            this.GridViewCategoria.Enabled = false;
            this.GridViewSubFamilia.Enabled = false;

            // Destrava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);

            // Detrava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);

            // Detrava bot&atilde;o de novo
            this.btnNovo.Enabled = true;

            // Desabilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = false;

            // trava upload de imagem
            this.AsyncFileUploadPQ.Enabled = false;
            this.AsyncFileUploadGD.Enabled = false;
            this.btnVisualizarImagem.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);
            this.btnRemoverImagemPequena.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);
            this.btnRemoverImagemGrande.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);
        }

        protected void grvResultado_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {

                ImageButton imgbExcluir = e.Row.FindControl("imgbExcluir") as ImageButton;

                imgbExcluir.Attributes.Add("onclick", "return confirma_exclusao();");

            }
        }

        protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
        {
            // Declara objetos
            ProdutoBO produtoBO = null;
            produto produtoVO = null;
            int idProduto = 0;

            try
            {
                // cria objeto
                produtoBO = new ProdutoBO();

                //
                idProduto = int.Parse(((ImageButton)sender).CommandArgument);

                //
                produtoVO = produtoBO.RecuperaProduto(idProduto); ;

                this.txtCadId.Text = idProduto.ToString();
                //this.ddlSubFamilia.SelectedValue = produtoVO.IdSubFamilia.ToString();
                this.txtCadProduto.Text = produtoVO.Produto;
                this.txtCadRef.Text = produtoVO.Referencia;
                this.txtCadCor.Text = produtoVO.Cor;
                this.txtCadMedida.Text = produtoVO.Medida;
                this.txtCadEmbalagem.Text = produtoVO.Embalagem;
                this.txtCadCaixa.Text = produtoVO.Caixa;
                this.txtCadUnidade.Text = produtoVO.Unidade;
                this.txtCadIPI.Text = produtoVO.IPI;

                this.LabelIdProduto.Text = produtoVO.IdProduto.ToString();
                this.LabelProduto.Text = produtoVO.Produto;


                this.ltCadastradoPor.Text = produtoVO.CadastradoPor;
                this.ltEditadoPor.Text = produtoVO.EditadoPor;
                this.ltDataCadastro.Text = ((DateTime)produtoVO.Cadastro).ToString();
                this.ltDataEdicao.Text = (produtoVO.Edicao == null ? "" : ((DateTime)produtoVO.Edicao).ToString());

                this.ImagePQ.ImageUrl = "~/DownProduto.aspx?idProduto=" + this.LabelIdProduto.Text + "&type=small&controle=" + DateTime.Now.Ticks;
                this.ImageGD.ImageUrl = "~/DownProduto.aspx?idProduto=" + this.LabelIdProduto.Text + "&type=large&controle=" + DateTime.Now.Ticks;

                List<produtoxcategoria> listProdutoXCategoria = produtoBO.RecuperaProdutoXCategoria(produtoVO.IdProduto, null);
                foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = (listProdutoXCategoria != null && (listProdutoXCategoria.Find(pc => pc.IdCategoria == Int32.Parse(gvr.Cells[1].Text)) != null));

                List<produtoxsubfamilia> listProdutoXSubFamilia = produtoBO.RecuperaProdutoXSubFamilia(produtoVO.IdProduto, null);
                foreach (GridViewRow gvr in this.GridViewSubFamilia.Rows)
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = (listProdutoXSubFamilia != null && (listProdutoXSubFamilia.Find(p => p.IdSubFamilia == Int32.Parse(gvr.Cells[1].Text)) != null));

                //
                this.tabProduto.ActiveTabIndex = 1;

                //
                Util.HabilitarCampos(false, this.panelCad);
                Util.HabilitarCampos(false, this.TabPanelFileUpload);
                this.GridViewCategoria.Enabled = false;
                this.GridViewSubFamilia.Enabled = false;

                //
                this.btnSalvar.Enabled = false;

                //
                this.btnEditar.Enabled = true;

                //
                this.btnExcluir.Enabled = true;

                //
                this.btnNovo.Enabled = true;

                // trava upload de imagem
                this.AsyncFileUploadPQ.Enabled = false;
                this.AsyncFileUploadGD.Enabled = false;
                this.btnVisualizarImagem.Enabled = true;
                this.btnRemoverImagemPequena.Enabled = true;
                this.btnRemoverImagemGrande.Enabled = true;

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento editar do web form
        /// </summary>
        /// <param name="sender">Objeto disparador de evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnEditar_Click(object sender, EventArgs e)
        {
            // Habilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(true, this.panelCad);
            Util.HabilitarCampos(true, this.TabPanelFileUpload);
            this.GridViewCategoria.Enabled = true;
            this.GridViewSubFamilia.Enabled = true;

            // Trava apenas o text box do ID
            this.txtCadId.Enabled = false;

            // Trava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = false;

            // Trava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = false;

            // Trava bot&atilde;o de novo
            this.btnNovo.Enabled = false;

            // Habilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = true;

            // Destrava upload de imagem
            this.AsyncFileUploadPQ.Enabled = true;
            this.AsyncFileUploadGD.Enabled = true;
            this.btnVisualizarImagem.Enabled = true;
            this.btnRemoverImagemPequena.Enabled = true;
            this.btnRemoverImagemGrande.Enabled = true;

            this.txtCadProduto.Focus();

        }

        protected void btnNovo_Click(object sender, EventArgs e)
        {
            //Limpa formulario, para a entrada de novo registro
            Util.LimparCampos(this.panelCad);
            Util.LimparCampos(this.TabPanelFileUpload);
            this.ltCadastradoPor.Text = "";
            this.ltEditadoPor.Text = "";
            this.ltDataCadastro.Text = "";
            this.ltDataEdicao.Text = "";

            this.ImagePQ.ImageUrl = "";
            this.ImageGD.ImageUrl = "";

            foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
            foreach (GridViewRow gvr in this.GridViewSubFamilia.Rows)
                ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;


            // Habilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(true, this.panelCad);
            this.GridViewCategoria.Enabled = true;
            this.GridViewSubFamilia.Enabled = true;

            // Trava apenas o text box do ID
            this.txtCadId.Enabled = false;

            // Trava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = false;

            // Trava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = false;

            // Trava bot&atilde;o de novo
            this.btnNovo.Enabled = false;

            // Habilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = true;

            // Trava upload de imagem
            this.AsyncFileUploadPQ.Enabled = false;
            this.AsyncFileUploadGD.Enabled = false;
            this.btnVisualizarImagem.Enabled = false;
            this.btnRemoverImagemPequena.Enabled = false;
            this.btnRemoverImagemGrande.Enabled = false;

            this.txtCadProduto.Focus();

        }

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            //Declara objetos
            produto produtoVO = null;
            ProdutoBO produtoBO = null;

            try
            {
                //Cria objeto
                produtoBO = new ProdutoBO();
                produtoVO = new produto();

                produtoVO.IdProduto = Int32.Parse(this.txtCadId.Text);
                produtoVO.Produto = this.txtCadProduto.Text;

                //Chama metodo para salvar ou criar novo registro
                produtoBO.DeletaProduto(produtoVO);
                produtoBO.DeletaProdutoxCategoria(produtoBO.RecuperaProdutoXCategoria(produtoVO.IdProduto, null));
                produtoBO.DeletaProdutoXSubFamilia(produtoBO.RecuperaProdutoXSubFamilia(produtoVO.IdProduto, null));

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro excluido com sucesso!");

                //Popula grid atualizado
                this.btnPesquisa_Click(null, null);

                //Limpa formulario, apos salvar os dados
                Util.LimparCampos(this.panelCad);
                Util.LimparCampos(this.TabPanelFileUpload);
                this.ltCadastradoPor.Text = "";
                this.ltEditadoPor.Text = "";
                this.ltDataCadastro.Text = "";
                this.ltDataEdicao.Text = "";

                this.ImagePQ.ImageUrl = "";
                this.ImageGD.ImageUrl = "";

                foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
                foreach (GridViewRow gvr in this.GridViewSubFamilia.Rows)
                    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;

                // Trava bot&atilde;o de edi&ccedil;&atilde;o
                this.btnEditar.Enabled = false;

                // Trava bot&atilde;o de exclusao
                this.btnExcluir.Enabled = false;

                // Desabilita o bot&atilde;o salvar
                this.btnSalvar.Enabled = false;

                // Habilida o botao novo
                this.btnNovo.Enabled = true;

                // Trava upload de imagem
                this.AsyncFileUploadPQ.Enabled = false;
                this.AsyncFileUploadGD.Enabled = false;
                this.btnVisualizarImagem.Enabled = false;
                this.btnRemoverImagemPequena.Enabled = false;
                this.btnRemoverImagemGrande.Enabled = false;

                this.TabPanelFileUpload.Enabled = false;

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        protected void ProcessUploadPQ(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
        {
            //Recupera dados
            ProdutoBO produtoBO = new ProdutoBO();
            produto produtoVO = produtoBO.RecuperaProduto(int.Parse(this.LabelIdProduto.Text));

            if (produtoVO == null)
            {
                this.LabelMensagem.Text = "É necess&aacute;rio salvar Produto antes de fazer Upload de imagem.";
                return;
            }

            // upload da imagem
            if (AsyncFileUploadPQ.PostedFile.FileName.Length > 0)
            {
                Stream st = AsyncFileUploadPQ.PostedFile.InputStream;
                byte[] fb = new byte[st.Length];

                fb = AsyncFileUploadPQ.GetBytesFromStream(st);
                produtoVO.MimeP = "image/jpeg"; //AsyncFileUploadPQ.PostedFile.ContentType;
                // ScriptManager.RegisterClientScriptBlock(AsyncFileUpload1, AsyncFileUpload1.GetType(), "img", "top.document.getElementById('imgUpload').src='image.jpg';", true);

                System.Drawing.Image img = Util.byteArrayToImage(fb);
                produtoVO.Fotop = Util.imageToByteArray(Util.MaxSize(img, 200, 200));
                img.Dispose();

                this.LabelMensagem.Text = fb.Length + " bytes enviados";
                //this.Image1.ImageUrl = "~/Imagens/DownSubFamilia.aspx?idSubFamilia=" + produtoVO.IdSubFamilia+"&controle="+DateTime.Now.Ticks;
            }

            produtoVO.Edicao = DateTime.Now;
            produtoVO.EditadoPor = usuarioVO.User;

            //Chama metodo para salvar ou criar novo registro
            produtoBO.SalvarProduto(produtoVO, false);

        }
        protected void ProcessUploadGD(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
        {
            //Recupera dados
            ProdutoBO produtoBO = new ProdutoBO();
            produto produtoVO = produtoBO.RecuperaProduto(int.Parse(this.LabelIdProduto.Text));

            if (produtoVO == null)
            {
                this.LabelMensagem.Text = "É necess&aacute;rio salvar o Produto antes de fazer Upload de imagem.";
                return;
            }

            // upload da imagem
            if (AsyncFileUploadGD.PostedFile.FileName.Length > 0)
            {
                Stream st = AsyncFileUploadGD.PostedFile.InputStream;
                byte[] fb = new byte[st.Length];

                fb = AsyncFileUploadGD.GetBytesFromStream(st);
                // ScriptManager.RegisterClientScriptBlock(AsyncFileUpload1, AsyncFileUpload1.GetType(), "img", "top.document.getElementById('imgUpload').src='image.jpg';", true);

                System.Drawing.Image img = Util.byteArrayToImage(fb);
                produtoVO.Fotog = Util.imageToByteArray(Util.MaxSize(img, 600, 600));
                img.Dispose();

                produtoVO.MimeG = "image/jpeg"; //AsyncFileUploadGD.PostedFile.ContentType;
                this.LabelMensagem.Text = fb.Length + " bytes enviados";
                //this.Image1.ImageUrl = "~/Imagens/DownSubFamilia.aspx?idSubFamilia=" + produtoVO.IdSubFamilia+"&controle="+DateTime.Now.Ticks;
            }

            produtoVO.Edicao = DateTime.Now;
            produtoVO.EditadoPor = usuarioVO.User;

            //Chama metodo para salvar ou criar novo registro
            produtoBO.SalvarProduto(produtoVO, false);

        }

        protected void btnVisualizarImagem_Click(object sender, EventArgs e)
        {
            this.ImagePQ.ImageUrl = "~/DownProduto.aspx?idProduto=" + this.LabelIdProduto.Text + "&type=small&controle=" + DateTime.Now.Ticks;
            this.ImageGD.ImageUrl = "~/DownProduto.aspx?idProduto=" + this.LabelIdProduto.Text + "&type=large&controle=" + DateTime.Now.Ticks;
        }

        protected void btnRemoverImagemPequena_Click(object sender, EventArgs e)
        {
            ProdutoBO produtoBO = new ProdutoBO();
            produto produtoVO = produtoBO.RecuperaProduto(int.Parse(this.LabelIdProduto.Text));

            if (produtoVO != null)
            {
                produtoVO.MimeP = "";
                produtoVO.Fotop = null;

                produtoBO.SalvarProduto(produtoVO, false);
                Util.ExibeAlert(this.Page, "Imagem pequena removida");
            }
        }

        protected void btnRemoverImagemGrande_Click(object sender, EventArgs e)
        {
            ProdutoBO produtoBO = new ProdutoBO();
            produto produtoVO = produtoBO.RecuperaProduto(int.Parse(this.LabelIdProduto.Text));

            if (produtoVO != null)
            {
                produtoVO.MimeG = "";
                produtoVO.Fotog = null;

                produtoBO.SalvarProduto(produtoVO, false);
                Util.ExibeAlert(this.Page, "Imagem grande removida");
            }
        }


    }
}
